
#include "TiposPersonaje.h"
#define MUSICA_FONDO 0
#define MUSICA_EVENTO 1

void GestionTiposPersonaje::Inicializar(vector<TipoPersonaje_y> tiposPersonajes) {
	
	for (unsigned int j = 0; j < tiposPersonajes.size(); j++) {

		tiposPersonaje.push_back(new TipoPersonaje(tiposPersonajes[j]));
	}
}

void GestionTiposPersonaje::AsignarTipoPersonaje(Personaje* personaje, string tipo) {
	
	for (unsigned int j=0; j<tiposPersonaje.size(); j++) {
		if (tiposPersonaje.at(j)->getNombre() == tipo) {
			
			tiposPersonaje.at(j)->AsignarAPersonaje(personaje);
		}
	}

}

vector<string> GestionTiposPersonaje::getListaTipos() {
	
	vector<string> tipos;
	for (unsigned int k=0; k<tiposPersonaje.size(); k++)
		tipos.push_back(tiposPersonaje.at(k)->getNombre());
	return tipos;
}


TipoPersonaje* GestionTiposPersonaje::getTipoPersonaje(int tipoPersonaje) {
	
	return tiposPersonaje.at(tipoPersonaje);
}

void GestionTiposPersonaje::Unset() {
	
	tiposPersonaje.clear();
}

TipoPersonaje::TipoPersonaje(TipoPersonaje_y tipoPersonaje) {
	
	this->nombre = tipoPersonaje.tipo;
	this->margenScroll = tipoPersonaje.margen_scroll;
	
	for (int i=0; i<SonidosPersonaje::Size; i++) {
		sonidos.push_back(0);
	}

	vector<string> descripciones = SonidosPersonaje::descripcionSonidos;
	for (unsigned int i=0; i<tipoPersonaje.sonidos.size(); i++) {
		for (unsigned int j=0; j<descripciones.size(); j++) {

			if (tipoPersonaje.sonidos.at(i).accion == descripciones.at(j)) {
				if ( descripciones[j] == "invencibilidad" ) {
					if (tipoPersonaje.sonidos.at(i).accion == descripciones.at(j)) {
						sonidos[j] = GestionSonidos::getId(MUSICA_FONDO, tipoPersonaje.sonidos.at(i).ruta);
						break;
					}
				} else {
					if (tipoPersonaje.sonidos.at(i).accion == descripciones.at(j)) {
						sonidos[j] = GestionSonidos::getId(MUSICA_EVENTO, tipoPersonaje.sonidos.at(i).ruta);
						break;
					}
				}
			}
		}
	}
	
	vector<Animacion_y> animaciones = tipoPersonaje.animaciones;	
	vector<string> descripcionParticulares = EstadoPersonaje::descripcionAccionesParticulares;
	
	vector<infoAccion_t> v_accionesParticulares = AsignarParticulares(tipoPersonaje.ancho, tipoPersonaje.alto, descripcionParticulares, &animaciones);

	for (unsigned int i=0; i<descripcionParticulares.size(); i++) {
		accionesParticulares.push_back(v_accionesParticulares[i]);
	}

	Inicializar(tipoPersonaje.ancho, tipoPersonaje.alto, animaciones, EstadoPersonaje::descripcionAcciones, tipoPersonaje.velocidad, tipoPersonaje.salto);
}

void TipoPersonaje::AsignarAPersonaje(Personaje* personaje) {
	
	AsignarAObjeto(personaje);
	
	personaje->setMargenScroll(margenScroll);
	
	for (unsigned int i=0; i<sonidos.size(); i++) {
		personaje->setIdSonido(sonidos.at(i), i);
	}
	
	for (unsigned int k=0; k<accionesParticulares.size(); k++) {
		personaje->addAccionParticular(accionesParticulares[k].idImagen, accionesParticulares[k].cuadros);
	}
}

string TipoPersonaje::getNombre() {
	return nombre;
}
				
vector<TipoPersonaje*> GestionTiposPersonaje::tiposPersonaje;
